/*
和queue不同的就在于我们可以自定义其中数据的优先级,
让优先级高的排在队列前面,优先出队

和队列基本操作相同:
    top 访问队头元素
    empty 队列是否为空
    size 返回队列内元素个数
    push 插入元素到队尾 (并排序)
    emplace 原地构造一个元素并插入队列
    pop 弹出队头元素
    swap 交换内容

#升序队列(小顶堆)
priority_queue <int,vector<int>,greater<int>> q;
#降序队列(大顶堆)
priority_queue <int,vector<int>,less<int>> q;

#greater和less是std实现的两个仿函数（就是使一个类的使用看上去像一个函数。
#其实现就是类中实现一个operator()，这个类就有了类似函数的行为，就是一个仿函数类了）

*/

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    //对于基础类型 默认是大顶堆(降序)
    priority_queue<int> a;
    //等同于 priority_queue<int, vector<int>, less<int> > a;

    priority_queue<int, vector<int>, greater<int>> c; //这样就是小顶堆
    priority_queue<string> b;

    for (int i = 0; i < 5; i++)
    {
        a.push(i);
        c.push(i);
    }
    while (!a.empty())
    {
        cout << a.top() << ' ';
        a.pop();
    }
    cout << endl;

    while (!c.empty())
    {
        cout << c.top() << ' ';
        c.pop();
    }
    cout << endl;

    b.push("abc");
    b.push("abcd");
    b.push("cbd");
    while (!b.empty())
    {
        cout << b.top() << ' ';
        b.pop();
    }
    cout << endl;
    return 0;
}
